//
//  SinaHomeViewModel.swift
//  mySina
//
//  Created by 刘莹 on 2016/11/17.
//  Copyright © 2016年 liuying. All rights reserved.
//

import UIKit
import SDWebImage

class SinaHomeViewModel: NSObject {
    //MARK: -
    //MARK: - 懒加载
    lazy var viewmodelArray:[SinaStatusViewModel] = [SinaStatusViewModel]()
   
    
    //MARK: -
    //MARK: - 加载数据
    
    /// 专门加载数据的方法,不负责和UI界面打交道
    ///
    /// - parameter isPullup: 是否正在上拉
    /// - parameter finished: 请求的回调
    func loadData(isPullup:Bool,finished: @escaping (Bool,Int) ->()){
        //获取当前登录用户及其所关注（授权）用户的最新微博
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        //let parameters = ["access_token":SinaUserAccountViewModel.shared.access_token]
        //let parameters = ["access_token":"2.00LDN9cGuSdsSC832f1371a6_ght9E"]
        //////////////////////////////////////////////////////////////////////
        var maxId : Int64 = 0//上拉返回<=maxId的数据
        var sinceId:Int64 = 0//下来返回>sinceId的数据
        if isPullup{
        
            //上拉
            maxId = viewmodelArray.last?.status?.id ?? 0
            if maxId != 0{
                maxId -= 1
            }
        }else{
            sinceId = viewmodelArray.first?.status?.id ?? 0
        }
        let parameters = ["access_token":SinaUserAccountViewModel.shared.access_token ?? "","max_id":"\(maxId)","since_id":"\(sinceId)"]
        //let parameters = ["access_token":"2.00WXgecGEUoz7D6ad5094c8aePDjBC","max_id":"\(maxId)","since_id":"\(sinceId)"]
        
        SinaNetWorkTools.shared.request(method: .GET, urlString: urlString, parameter: parameters) { (responseObj, error) in
            
            if error != nil{
                //print(error)
                    return
                }
            //解析数据
            //将Any 转换为 [String:Any]
            let dict = responseObj as! [String:Any]
            guard let array = dict["statuses"] as? [[String:Any]] else{
            
                return
            }
            //遍历数组 字典转模型
            var tempArray = [SinaStatusViewModel]()
            for item in array{
            
                    let viewmodel = SinaStatusViewModel()
                let s = SinaStatus()
                //调用对象的YYmodel扩充的对象方法传入字典 -> 模型数据
                s.yy_modelSet(with: item)
                //给ViewModel的status赋值
                viewmodel.status = s
                //添加到一个临时数组中 获取数据都是按页一次20条
                tempArray.append(viewmodel)
            }
            //执行成功的回到
            //如果是上拉加载更多的数据就执行追加操作
            if isPullup{//上拉加载更多数据,追加
                self.viewmodelArray = self.viewmodelArray + tempArray
            }else{//初次&下拉刷新,直接赋值&执行插入到前面
                self.viewmodelArray = tempArray + self.viewmodelArray
               // print("~~~~~~~~~~~~~~~~~~~~~~~~~\(self.viewmodelArray.count)")
               
            
            }
            finished(true,tempArray.count)
            self.cacheStatusSingleImage(array: tempArray, finished: finished)
            //在这里执行回调能够确保单张图片下载完毕吗?

        }
    }
 
            
   
    //MARK: -
    //MARK: - 缓存单张图片
    private func cacheStatusSingleImage(array:[SinaStatusViewModel],finished:@escaping(Bool,Int) -> ()){
    
        if array.count == 0{
        
            //一定要执行回调
            finished(true,0)
            return
        }
        
        //遍历视图模型
        //使用调度组
        let group = DispatchGroup()
        for viewmodel in array{
        
            if viewmodel.imageURLs?.count == 1{
                //只有一张图片
                //执行下载图片的操作
                //异步任务,希望所有的异步任务执行完毕之后再执行回调
                //在开始异步任务之前,执行入组的操作,调度组中的异步任务+1
                group.enter()
                let url = URL(string: viewmodel.imageURLs?.first?.wap360 ?? "")
                SDWebImageManager.shared().downloadImage(with: url, options: [], progress: nil, completed: { (_, _, _, _, _) in
                    
                    //print("单张图片下载成功")
                    
                    //出组
                    group.leave()
                    
                })
                
            }
        }
        //执行统一的回调
        group.notify(queue: DispatchQueue.main, execute: {
        
            //print("--所有的单张图片都下载完毕")
            finished(true,array.count)
        
        })
    }

}
